<?php
/**
 * @copyright   Copyright(c) 2018
 * @author      tianjie
 * @link        http://www.tinphp.com/
 */

namespace tian;

class Loader
{
    /* 路径映射 根命名空间目录 */
    public static $vendorMap = array(
        'app' => APP_PATH,
        'tian' => Tian_PATH,
    );

    /**
     * 注册自动加载机制
     * @access public
     * @param callable $autoload 自动加载处理方法
     * @return void
     */
    public static function register($autoload = null)
    {
        // 注册系统自动加载
        spl_autoload_register($autoload ?: 'tian\\Loader::autoload', true, true);

        //自动加载composer类库
        if (file_exists(VENDOR_PATH . "autoload" . SUFFIX)) {
            require_once(VENDOR_PATH . "autoload" . SUFFIX);
        }
    }

    /**
     * 自动加载器
     */
    public static function autoload($class = null): void
    {
        $file = self::findFile($class);
        if (file_exists($file)) {
            self::includeFile($file);
        }
        //echo"<pre>";print_r(self::$vendorMap);echo"</pre>";
    }

    /**
     * 解析文件路径
     */
    private static function findFile($class): string
    {
        //顶级命名空间
        $vendor = substr($class, 0, strpos($class, '\\'));
        if($vendor){
            // 文件基目录
            $vendorDir = self::$vendorMap[$vendor];
            // 文件相对路径
            $filePath = substr($class, strlen($vendor) + 1) . SUFFIX;
            // 文件标准路径
            return strtr($vendorDir . $filePath, '\\', DIRECTORY_SEPARATOR);
        }else{
            return '';
        }
    }

    /**
     * 引入文件
     */
    private static function includeFile($file): void
    {
        if (is_file($file)) {
            include $file;
        }
    }
}